﻿using Prism.Commands;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Windows;

namespace Zhy.PrismRegion.Navigat.ViewModels.Pages
{
    public class ViewAViewModel :
       INavigationAware, // 接收导航参传递接口
       IRegionMemberLifetime, // 控制页面是否自动销毁接口
       IConfirmNavigationRequest // 当从当前页面跳转到另一个页面时触发，用于弹出提示框提示是否打开新页面等操作。
    {
        /// <summary>
        /// 页面上要显示的标题信息
        /// </summary>
        public string Title { get; set; } = "View A";
        /// <summary>
        /// 页面关闭按钮事件
        /// </summary>
        public ICommand CloseTabCommand { get; set; }
        
        /// <summary>
        /// 导航页面管理器
        /// </summary>
        IRegionManager _regionManager;
        /// <summary>
        /// 历史记录管理接口
        /// </summary>
        IRegionNavigationJournal _journal;
        
        /// <summary>
        /// 
        /// </summary>
        /// <param name="region">导航服务</param>
        /// <param name="journal"></param>
        /// <param name="regionManager">d导航页面管理器</param>
        public ViewAViewModel(
            IRegionNavigationService region,
            IRegionNavigationJournal journal,
            IRegionManager regionManager)
        {
            _regionManager = regionManager;
            //_journal = journal;
            #region 可以给导航挂载的一些相应事件 - 这个是扩展知识点
            {
                region.Navigating += Region_Navigating; //  正在导航事件
                region.NavigationFailed += Region_NavigationFailed;  // 导航失败事件
                #region 关于导航的历史记录扩展  类似于VS的前进和后退功能 - 具体使用后期可以百度一下。
                var status4 = region.Journal; // 导航的历史记录
                var DaoHang1 = status4.CanGoBack; // 返回
                var DaoHang2 = status4.GoForward; // 向前
                // 。。。。等等一些操作
                #endregion
                var status3 = region.Region; // 导航列表，使用那个列表进行导航的
            }
            #endregion

            CloseTabCommand = new DelegateCommand(DoCloseTab);
        }

        

        #region 导航事件 - 
        /// <summary>
        /// 正在导航事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <exception cref="NotImplementedException"></exception>
        private void Region_Navigating(object? sender, RegionNavigationEventArgs e)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// 导航失败事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <exception cref="NotImplementedException"></exception>
        private void Region_NavigationFailed(object? sender, RegionNavigationFailedEventArgs e)
        {
            throw new NotImplementedException();
        }
        #endregion

        #region 当前页面的按钮事件
        /// <summary>
        /// 关闭当前子页面按钮
        /// </summary>
        private void DoCloseTab()
        {
            var region = _regionManager.Regions["ViewRegion"]; // 获取导航的子页面列表
            var view = region.Views.FirstOrDefault(v => v.GetType().Name == "ViewA"); // 获取当前子页面
            region.Remove(view); // 子页面管理器中移除当前子页面

            //region.RemoveAll();// 关闭所有子页面

            // 导航后退
            //_journal.GoBack();
        }
        #endregion

        #region IRegionMemberLifetime接口方法 - 用来控制切换页面时子页面是否自动销毁

        // 用来控制当前页面非激活状态，是否在Region中保留 - 用来控制切换页面时子页面是否自动销毁
        public bool KeepAlive => true;  // true 保留 false 不保留

        #endregion

        #region INavigationAware接口方法 - 用来控制打开子页面、关闭子页面-子页面是否允许重复打开、以及参数传递
        /// <summary>
        /// 是否允许重复导航进来
        /// </summary>
        /// <param name="navigationContext">参数的数据上下文</param>
        /// <returns></returns>
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            // 是否允许重复导航进来
            // 主-》A-》B-》A (显示之前打开的A页面)  返回True
            // 主-》A-》B-》A（从新创建一个新的A页面）     返回false
            return true;


            // 编辑页面，通过主页的子项点击，打开这个页面，
            // 子项有很多，可能同时打开多个子项进行编辑
        }

        // INavigationAware
        /// <summary>
        /// 从当前View导航出去的时候触发
        /// </summary>
        /// <param name="navigationContext">参数的数据上下文</param>
        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
            // 从当前View导航出去的时候触发
            // 从某个页面跳转到另一个页面的时候，可以把这个信息带过去
            navigationContext.Parameters.Add("abcd", "Hello ViewA"); // 从当前子页面跳转到下一个子页面，要传递的参数
        }

        // INavigationAware
        /// <summary>
        /// 打开当前View的时候触发
        /// </summary>
        /// <param name="navigationContext">参数的数据上下文</param>
        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            // 获取导航历史记录，进行后退、前进操作
            _journal = navigationContext.NavigationService.Journal;
            // 打开当前View的时候触发
            string arg = navigationContext.Parameters.GetValue<string>("abcd"); // 获取主页面传递过来的参数

        }
        #endregion

        #region IConfirmNavigationRequest接口方法 - 当从当前页面跳转到另一个页面时触发，用于弹出提示框提示是否打开新页面等操作。
        // 当从当前页面跳转到另一个页面时触发
        // OnNavigatedFrom调用前执行
        /// <summary>
        /// 当从当前页面跳转到另一个页面时触发
        /// </summary>
        /// <param name="navigationContext"></param>
        /// <param name="continuationCallback"></param>
        public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
        {
            // 打开某个页面，
            if (MessageBox.Show("是否打开？", "导航提示", MessageBoxButton.YesNo) ==
                MessageBoxResult.Yes)
            {
                /// 继续打开
                /// 
                continuationCallback?.Invoke(true);
            }
            else
                // 不被导航
                continuationCallback?.Invoke(false);
        }
        #endregion
    }
}
